home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
ashe-1.1
/
xmarkup.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-15
|
17KB
|
581 lines
/** xmarkup.c - (c) 1994 Copyright by John R. Punin
*
* ASHE HTML Editor
*
* This file has the routines to make additional markup tags for HTML document.
*
* John R. Punin April -29 - 1994
*
*/
#include "xhtml.h"
#include "xmarkup.h"
#include "xheader.h"
static int ismap = 0;
static int align = TOP_AL;
/*
NAME : create_linker
PARAMETERS : Widget w
From what widget this function is called.
RETURN : void
DESCRIPTION : This function creates the Dialog Window that
ask for the URL name of the document to be pointed
and the reference name, also it shows the selected text
that is going to be the link
*/
void
create_linker(Widget w,HTMLED *he)
{
Widget dialog,name_box,text_name,label_name;
XmString l = XmStringCreateSimple("Reference Name :");
XmString t = XmStringCreateLtoR("\n\nURL Name :",XmSTRING_DEFAULT_CHARSET);
XmString u =
XmStringCreateLtoR("Link Name :\n\t",XmSTRING_DEFAULT_CHARSET);
XmString label,tu;
XmString clear = XmStringCreateSimple("Clear");
char *selection_linker=NULL;
dialog = XmCreatePromptDialog(he->textarea,"Linker",NULL,0);
if(selection_linker = XmTextGetSelection(he->textarea))
{
tu = XmStringCreateLtoR(selection_linker,XmSTRING_DEFAULT_CHARSET);
XtFree(selection_linker);
label = XmStringConcat(u,tu);
XmStringFree(u);
u = XmStringConcat(label,t);
XmStringFree(tu);
}
else
{
label = XmStringConcat(u,t);
XmStringFree(u);
u = XmStringCopy(label);
}
XtVaSetValues(dialog, XmNselectionLabelString,u,
XmNapplyLabelString,clear,NULL);
XmStringFree(label); XmStringFree(t);
XmStringFree(u);
name_box = XmCreateForm(dialog,"namebox",NULL,0);
label_name = XmCreateLabel(name_box,"label_name",NULL,0);
XtVaSetValues(label_name,XmNlabelString,l,NULL);
XmStringFree(l);
XtManageChild(label_name);
text_name = XmCreateText(name_box,"text_name",NULL,0);
XtVaSetValues(text_name, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, label_name,
XmNcolumns,25,
NULL);
XtManageChild(text_name);
XtManageChild(name_box);
he->user_data = (XtPointer)text_name;
/* When the user types the URL name, call linker_name()... */
XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)linker_name,(XtPointer)he);
/* If the user selects cancel, just detroy the dialog */
XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
/* Clear button is available */
XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
/* No help is available */
XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
XtManageChild(dialog);
XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
0,0,800,800,0,0);
}
/*
NAME : linker_name
PARAMETERS : Widget text_name
Widget where the reference name is saved
XmSelectionBoxCallbackStruct *cbs
value of the function that have the URL name
RETURN : void
DESCRIPTION : This function set the link using the URL name
and the reference name and it is inserted to the
selected text
*/
void
linker_name(Widget w,
HTMLED *he,
XmSelectionBoxCallbackStruct *cbs)
{
Widget text_name = (Widget)he->user_data;
XmTextPosition left=0,right=0;
int len,lsel=0;
char *ssel = NULL;
char *str=NULL,*value=NULL,*sel=NULL;
he->last_command = LINKER;
if(XmTextGetSelectionPosition(he->textarea,&left,&right))
{
if(right<=left)
left = right = XmTextGetInsertionPosition(he->textarea);
}
else
left = right = XmTextGetInsertionPosition(he->textarea);
if(left!=right)
{
ssel = XmTextGetSelection(he->textarea);
lsel = strlen(ssel);
}
if(cbs->value!=NULL)
{
XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value);
len = strlen(value);
str = XtMalloc(len+20);
}
sel = XmTextGetString(text_name);
if(value!=NULL)
{
XmTextInsert(he->textarea,right,"</A>");
if(strlen(sel)==0)
sprintf(str,"<A HREF=\"%s\">",value);
else
sprintf(str,"<A HREF=\"%s#%s\">",value,sel);
XmTextInsert(he->textarea,left,str);
if(lsel==0)
{
if (!strlen(sel))
XmTextSetInsertionPosition(he->textarea,
left+strlen(sel)+strlen(value)+11);
else
XmTextSetInsertionPosition(he->textarea,
left+strlen(sel)+strlen(value)+12);
}
else
{
if (!strlen(sel))
XmTextSetInsertionPosition(he->textarea,
left+strlen(sel)+strlen(value)+lsel+15);
else
XmTextSetInsertionPosition(he->textarea,
left+strlen(sel)+strlen(value)+lsel+16);
}
}
else
{
XmTextInsert(he->textarea,left,"<A HREF=\"\"></A> ");
XmTextSetInsertionPosition(he->textarea,left + 10);
}
XtFree(str);
XtFree(sel);
XtFree(ssel);
XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
}
/*
NAME : create_reference
PARAMETERS : Widget w
From what widget this function is called.
RETURN : void
DESCRIPTION : This function creates the dialog widget title
to enter the reference name
*/
void
create_reference(Widget w,HTMLED *he)
{
Widget dialog;
XmString rt =
XmStringCreateLtoR("Referenced text :\n\t",XmSTRING_DEFAULT_CHARSET);
XmString sr,r =
XmStringCreateLtoR("\n\nReference Name :",XmSTRING_DEFAULT_CHARSET);
XmString label,clear =XmStringCreateSimple("Clear");
char *sel_reference=NULL;
dialog = XmCreatePromptDialog(he->textarea,"Reference",NULL,0);
if(sel_reference = XmTextGetSelection(he->textarea))
{
sr = XmStringCreateLtoR(sel_reference,XmSTRING_DEFAULT_CHARSET);
XtFree(sel_reference);
label = XmStringConcat(rt,sr);
XmStringFree(rt);
rt= XmStringConcat(label,r);
XmStringFree(sr);
}
else
{
label = XmStringConcat(rt,r);
XmStringFree(rt);
rt = XmStringCopy(label);
}
XtVaSetValues(dialog,
XmNselectionLabelString,rt,
XmNapplyLabelString,clear,NULL);
XmStringFree(label); XmStringFree(r); XmStringFree(clear);
/* When the user types the Reference name, call linker_name()... */
XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)reference_name,(XtPointer)he);
/* If the user selects cancel, just detroy the dialog */
XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
/* Clear button is available */
XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
/* No help is available */
XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
XtManageChild(dialog);
XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
0,0,800,800,0,0);
}
/*
NAME : reference_name
PARAMETERS : XmSelectionBoxCallbackStruct *cbs
This has the value of the reference name
RETURN : void
DESCRIPTION : This function sets the tags of the reference
name to the selected text
*/
void
reference_name(Widget w,
XtPointer client_data,
XmSelectionBoxCallbackStruct *cbs)
{
HTMLED *he = (HTMLED *)client_data;
XmTextPosition left=0,right=0;
int len,lsel=0;
char *sel=NULL;
char *str=NULL,*value=NULL;
he->last_command = REFER;
if(XmTextGetSelectionPosition(he->textarea,&left,&right))
{
if(right<=left)
left = right = XmTextGetInsertionPosition(he->textarea);
}
else
left = right = XmTextGetInsertionPosition(he->textarea);
if(left!=right)
{
sel = XmTextGetSelection(he->textarea);
lsel = strlen(sel);
}
if(cbs->value!=NULL)
{
XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value);
len = strlen(value);
str = XtMalloc(len+20);
}
if(value!=NULL)
{
if((len==0)&&(lsel==0))
{
sprintf(str,"<A NAME=\"\"></A>");
XmTextInsert(he->textarea,left,str);
XmTextSetInsertionPosition(he->textarea,left +11);
}
else
{
XmTextInsert(he->textarea,right,"</A>");
sprintf(str,"<A NAME=\"%s\">",value);
XmTextInsert(he->textarea,left,str);
if(lsel==0)
XmTextSetInsertionPosition(he->textarea,left+len+ 11);
else
XmTextSetInsertionPosition(he->textarea,left +lsel+len+ 15);
}
}
XtFree(sel);
XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
XtFree(str);
}
/*
NAME : create_figure
PARAMETERS : Widget w
From what widget this function is called.
RETURN : void
DESCRIPTION : This function creates the dialog widget image
to enter the name of the URL of the image file.
It has a toggle button to select top or bottom
aligning with the text.
*/
void
create_figure(Widget w,HTMLED *he)
{
Widget dialog,name_box,option_align,togglebutton;
XmString t = XmStringCreateLtoR("Image Name: \n",XmSTRING_DEFAULT_CHARSET);
XmString clear =XmStringCreateSimple("Clear");
XmString bottomal =XmStringCreateSimple("Bottom");
XmString topal =XmStringCreateSimple("Top");
XmString middleal =XmStringCreateSimple("Middle");
XmString align_label = XmStringCreateSimple("Alignment :");
XmString ismapstr =XmStringCreateLtoR("ISMAP\n",XmSTRING_DEFAULT_CHARSET);
ismap = 0; align = TOP_AL;
dialog = XmCreatePromptDialog(he->textarea,"Image",NULL,0);
XtVaSetValues(dialog,
XmNselectionLabelString,t,
XmNapplyLabelString,clear,NULL);
XmStringFree(clear); XmStringFree(t);
name_box = XmCreateForm(dialog,"namebox",NULL,0);
option_align = XmVaCreateSimpleOptionMenu(name_box,"option_align",
align_label,'\0',0 /* initial menu selection */,align_cb,
XmVaPUSHBUTTON,topal,'\0',NULL,NULL,
XmVaPUSHBUTTON,middleal,'\0',NULL,NULL,
XmVaPUSHBUTTON,bottomal,'\0',NULL,NULL,
XmNuserData,he,
NULL);
XmStringFree(align_label); XmStringFree(topal);
XmStringFree(bottomal);XmStringFree(middleal);
XtManageChild(option_align);
togglebutton = XmCreateToggleButton(name_box,"toggletop",NULL,0);
XtManageChild(togglebutton);
XtVaSetValues(togglebutton,
XmNlabelString,ismapstr,NULL);
XtAddCallback(togglebutton,XmNvalueChangedCallback,(XtCallbackProc)ismap_check,NULL);
XmStringFree(ismapstr);
XtVaSetValues(option_align, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,togglebutton,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(togglebutton, XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
NULL);
/* When the user types the Reference name, call linker_name()... */
XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)image_name,(XtPointer)he);
/* If the user selects cancel, just detroy the dialog */
XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
/* Clear button is available */
XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
/* No help is available */
XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
XtManageChild(name_box);
XtManageChild(dialog);
XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
0,0,800,800,0,0);
}
void
ismap_check(Widget w,
XtPointer client_data, XtPointer call_data)
{
if(ismap == 0)
ismap = 1;
else
ismap = 0;
}
void
align_cb(Widget w,
XtPointer client_data, XtPointer call_data)
{
int item_no = (int)client_data;
align = item_no;
}
/*
NAME : image_name
PARAMETERS : XmSelectionBoxCallbackStruct *cbs
It has the URL image name
RETURN : void
DESCRIPTION : This function insert the image tag to the
current position of the cursor
*/
void
image_name(Widget w,
XtPointer client_data,
XmSelectionBoxCallbackStruct *cbs)
{
HTMLED *he = (HTMLED *)client_data;
char *imagefile=NULL;
char *imagename=NULL;
int len=0;
XmTextPosition left;
if(cbs->value!=NULL)
{
XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&imagefile);
len = strlen(imagefile);
imagename = XtMalloc(len+50);
}
else
imagename = XtMalloc(50);
if(imagefile!=NULL)
{
if(align==TOP_AL)
sprintf(imagename,"<IMG ALIGN=\"TOP\" SRC = \"%s\" ",imagefile);
else if (align == MIDDLE_AL)
sprintf(imagename,"<IMG ALIGN=\"MIDDLE\" SRC = \"%s\" ",imagefile);
else
sprintf(imagename,"<IMG ALIGN=\"BOTTOM\" SRC = \"%s\" ",imagefile);
}
else
{
printf("Image Error\n");
}
if(ismap)
strcat(imagename," ISMAP");
strcat(imagename,">");
len = strlen(imagename);
left = XmTextGetInsertionPosition(he->textarea);
XmTextInsert(he->textarea,left,imagename);
XmTextSetInsertionPosition(he->textarea,left+len);
XtFree(imagename);
XtFree(imagefile);
ismap = 0; align = TOP_AL;
XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
}
/*
NAME : create_pre
PARAMETERS : Widget w
From what widget this function is called.
RETURN : void
DESCRIPTION : This function creates a message dialog widget
to show the selected text to be in preformatted way
*/
void
create_pre(Widget w,HTMLED *he)
{
Widget dialog;
XmString mstring,u,t =
XmStringCreateLtoR("Preformatted text is : \n",XmSTRING_DEFAULT_CHARSET);
XmString t2=
XmStringCreateLtoR("Commentary text is : \n",XmSTRING_DEFAULT_CHARSET);
char *mstr;
mstr = XmTextGetSelection(he->textarea);
if(strcmp(XtName(w),"button_5"))
he->user_data = (XtPointer)PRE;
else
he->user_data = (XtPointer)COMMENT;
if(mstr)
{
dialog = XmCreatePromptDialog(he->textarea,"notice_header",NULL,0);
mstring = XmStringCreateLtoR(mstr,XmSTRING_DEFAULT_CHARSET);
if(he->user_data == (XtPointer)PRE)
u = XmStringConcat(t,mstring);
else
u = XmStringConcat(t2,mstring);
XmStringFree(mstring);XmStringFree(t);XmStringFree(t2);
XtVaSetValues(dialog,
XmNselectionLabelString,u,NULL);
XmStringFree(u);
/* When the user choose a size of the header, call set_header */
XtAddCallback(dialog, XmNokCallback,(XtCallbackProc)set_pre,(XtPointer)he);
/* If the user selects cancel, just destroy the header dialog */
XtAddCallback(dialog, XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
/* Nor help neither text is available.... */
XtUnmanageChild(XmSelectionBoxGetChild(dialog,XmDIALOG_HELP_BUTTON));
XtUnmanageChild(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT));
XtManageChild(dialog);
XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
XtWindow(dialog),
0,0,800,800,20,20);
}
else
set_pre(w,he);
}
/*
NAME : set_pre
PARAMETERS : Widget w
From what widget this function is called.
RETURN : void
DESCRIPTION : This function sets the preformatted tags
to the selected text
*/
void
set_pre(Widget w,HTMLED *he)
{
XmTextPosition left=0,right=0;
int len;
enum commands flag = (enum commands)he->user_data;
if(flag==PRE)
he->last_command = PRE;
else
he->last_command = COMMENT;
if(XmTextGetSelectionPosition(he->textarea,&left,&right))
{
if(right<=left)
left = right = XmTextGetInsertionPosition(he->textarea);
}
else
left = right = XmTextGetInsertionPosition(he->textarea);
len = right -left;
if(flag==PRE)
{
XmTextInsert(he->textarea,right,"\n</PRE>\n");
XmTextInsert(he->textarea,left,"\n<PRE>\n");
}
else
{
XmTextInsert(he->textarea,right," -->");
XmTextInsert(he->textarea,left,"<!-- ");
}
if(len == 0)
{
if(flag == PRE)
XmTextSetInsertionPosition(he->textarea,left + 7);
else
XmTextSetInsertionPosition(he->textarea,left + 5);
}
else
{
if(flag == PRE)
XmTextSetInsertionPosition(he->textarea,left +len + 15);
else
XmTextSetInsertionPosition(he->textarea,left +len + 9);
}
he->user_data = NULL;
XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
}